home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2003 November A / PCWK1103A.iso / ABBYY FineReader 7.0 PRO / data1.cab / gs_res.ps < prev    next >
Text File  |  2002-02-23  |  30KB  |  928 lines

  1. %    Copyright (C) 1994, 1996, 1997, 1998, 1999, 2000 Aladdin Enterprises.  All rights reserved.
  2. % This software is provided AS-IS with no warranty, either express or
  3. % implied.
  4. % This software is distributed under license and may not be copied,
  5. % modified or distributed except as expressly authorized under the terms
  6. % of the license contained in the file LICENSE in this distribution.
  7. % For more information about licensing, please refer to
  8. % http://www.ghostscript.com/licensing/. For information on
  9. % commercial licensing, go to http://www.artifex.com/licensing/ or
  10. % contact Artifex Software, Inc., 101 Lucas Valley Road #110,
  11. % San Rafael, CA  94903, U.S.A., +1(415)492-9861.
  12.  
  13. % $Id: gs_res.ps,v 1.16.2.1 2002/02/22 19:45:55 ray Exp $
  14. % Initialization file for Level 2 resource machinery.
  15. % When this is run, systemdict is still writable,
  16. % but (almost) everything defined here goes into level2dict.
  17.  
  18. level2dict begin
  19.  
  20. (BEGIN RESOURCES) VMDEBUG
  21.  
  22. % We keep track of (global) instances with another entry in the resource
  23. % dictionary, an .Instances dictionary.  For categories with implicit
  24. % instances, the values in .Instances are the same as the keys;
  25. % for other categories, the values are [instance status size].
  26.  
  27. % Note that the dictionary that defines a resource category is stored
  28. % in global VM.  The PostScript manual says that each category must
  29. % manage global and local instances separately.  However, objects in
  30. % global VM other than systemdict can't reference objects in local VM.
  31. % This means that the resource category dictionary, which would otherwise be
  32. % the obvious place to keep track of the instances, can't be used to keep
  33. % track of local instances.  Instead, we define a dictionary in local VM
  34. % called localinstancedict, in which the key is the category name and
  35. % the value is the analogue of .Instances for local instances.
  36.  
  37. % We don't currently implement automatic resource unloading.
  38. % When and if we do, it should be hooked to the garbage collector.
  39. % However, Ed Taft of Adobe says their interpreters don't implement this
  40. % either, so we aren't going to worry about it for a while.
  41.  
  42. currentglobal false setglobal systemdict begin
  43.   /localinstancedict 5 dict
  44.   .forcedef    % localinstancedict is local, systemdict is global
  45. end true setglobal
  46. /.emptydict 0 dict readonly def
  47. setglobal
  48.  
  49. % Resource category dictionaries have the following keys (those marked with
  50. % * are optional):
  51. %    Standard, defined in the Red Book:
  52. %        Category (name)
  53. %        *InstanceType (name)
  54. %        DefineResource
  55. %            <key> <instance> DefineResource <instance>
  56. %        UndefineResource
  57. %            <key> UndefineResource -
  58. %        FindResource
  59. %            <key> FindResource <instance>
  60. %        ResourceStatus
  61. %            <key> ResourceStatus <status> <size> true
  62. %            <key> ResourceStatus false
  63. %        ResourceForAll
  64. %            <template> <proc> <scratch> ResourceForAll -
  65. %        *ResourceFileName
  66. %            <key> <scratch> ResourceFileName <filename>
  67. %    Additional, specific to our implementation:
  68. %        .Instances (dictionary)
  69. %        .LocalInstances
  70. %            - .LocalInstances <dict>
  71. %        .GetInstance
  72. %            <key> .GetInstance <instance> -true-
  73. %            <key> .GetInstance -false-
  74. %        .CheckResource
  75. %            <key> <value> .CheckResource <key> <value> <ok>
  76. %              (or may give an error if not OK)
  77. %        .DoLoadResource
  78. %            <key> .DoLoadResource <key> (may give an error)
  79. %        .LoadResource
  80. %            <key> .LoadResource - (may give an error)
  81. %        .ResourceFile
  82. %            <key> .ResourceFile <file> -true-
  83. %            <key> .ResourceFile <key> -false-
  84. %        .ResourceFileStatus
  85. %            <key> .ResourceFileStatus 2 <vmusage> -true-
  86. %            <key> .ResourceFileStatus -false-
  87. % All the above procedures expect that the top dictionary on the d-stack
  88. % is the resource dictionary.
  89.  
  90. % Define enough of the Category category so we can define other categories.
  91. % The dictionary we're about to create will become the Category
  92. % category definition dictionary.
  93.  
  94. % .findcategory and .resourceexec are only called from within the
  95. % implementation of the resource 'operators', so they doesn't have to worry
  96. % about cleaning up the stack if they fail (the interpreter's stack
  97. % protection machinery for pseudo-operators takes care of this).
  98. /.findcategory {    % <name> .findcategory -
  99.             %   (pushes the category on the dstack)
  100.   /Category findresource begin
  101. } bind def
  102.  
  103. /.resourceexec {    % <key> /xxxResource .resourceexec -
  104.             %   (also pops the category from the dstack)
  105.   load exec end
  106. } bind def
  107.  
  108. % .getvminstance treats instances on disk as undefined.
  109. /.getvminstance {    % <key> .getvminstance <instance> -true-
  110.             % <key> .getvminstance -false-
  111.   .GetInstance {
  112.     dup 1 get 2 ne { true } { pop false } ifelse
  113.   } {
  114.     false
  115.   } ifelse
  116. } bind def
  117.  
  118. 20 dict begin
  119.  
  120.         % Standard entries
  121.  
  122. /Category /Category def
  123. /InstanceType /dicttype def
  124.  
  125. /DefineResource {
  126.     .CheckResource {
  127.       dup /Category 3 index cvlit .growput
  128.       dup [ exch 0 -1 ] exch
  129.       .Instances 4 2 roll put
  130.         % Make the Category dictionary read-only.  We will have to
  131.         % use .forceput / .forcedef later to replace the dummy,
  132.         % empty .Instances dictionary with the real one later.
  133.       readonly
  134.     } {
  135.       /defineresource load /typecheck signalerror
  136.     } ifelse
  137. } bind def
  138. /FindResource        % (redefined below)
  139.     { .Instances exch get 0 get
  140.     } bind def
  141.  
  142.         % Additional entries
  143.  
  144. /.Instances 30 dict def
  145. .Instances /Category [currentdict 0 -1] put
  146.  
  147. /.LocalInstances 0 dict def
  148. /.GetInstance
  149.     { .Instances exch .knownget
  150.     } bind def
  151. /.CheckResource
  152.     { dup gcheck currentglobal and
  153.        { /DefineResource /FindResource /ResourceForAll /ResourceStatus
  154.          /UndefineResource }
  155.        { 2 index exch known and }
  156.       forall
  157.       not { /defineresource load /invalidaccess signalerror } if
  158.       true
  159.     } bind def
  160.  
  161. .Instances end begin    % for the base case of findresource
  162.  
  163. (END CATEGORY) VMDEBUG
  164.  
  165. % Define the resource operators.  We use the "stack protection" feature of
  166. % odef to make sure the stacks are restored properly on an error.
  167. % This requires that the operators not pop anything from the stack until
  168. % they have executed their logic successfully.  We can't make this
  169. % work for resourceforall, because the procedure it executes mustn't see
  170. % the operands of resourceforall on the stack, but we can make it work for
  171. % the others.
  172.  
  173. % findresource is the only operator that needs to bind //Category.
  174. /findresource {        % <key> <category> findresource <instance>
  175.     2 copy dup /Category eq
  176.       { pop //Category 0 get begin } { .findcategory } ifelse
  177.     /FindResource .resourceexec exch pop exch pop
  178. } bind
  179. end        % .Instances of Category
  180. odef
  181.  
  182. /defineresource {    % <key> <instance> <category> defineresource <instance>
  183.     3 copy .findcategory
  184.     currentdict /InstanceType known {
  185.       dup type InstanceType ne {
  186.         dup type /packedarraytype eq InstanceType /arraytype eq and
  187.         not { /defineresource load /typecheck signalerror } if
  188.       } if
  189.     } if
  190.     /DefineResource .resourceexec
  191.     4 1 roll pop pop pop
  192. } bind odef
  193. % We must prevent resourceforall from automatically restoring the stacks,
  194. % because we don't want the stacks restored if proc causes an error.
  195. % On the other hand, resourceforall is defined in the PLRM as an operator,
  196. % so it must have type /operatortype.  We hack this by taking advantage of
  197. % the fact that the interpreter optimizes tail calls, so stack protection
  198. % doesn't apply to the very last token of an operator procedure.
  199. /resourceforall1 {    % <template> <proc> <scratch> <category> resourceforall1 -
  200.     dup /Category findresource begin
  201.     /ResourceForAll load
  202.         % Make sure we can recover the original operands.
  203.         % We must create the array in local VM, in case any of the
  204.         % operands are local.
  205.         % Stack: ...operands... proc
  206.     5 copy pop .currentglobal false .setglobal 5 1 roll
  207.     4 packedarray exch .setglobal count
  208.         % Stack: ...operands... proc saved count
  209.     4 -1 roll pop        % pop the category
  210.     /stopped load 3 1 roll
  211.     3 .execn
  212.         % Stack: ... stopped saved count
  213.     3 -1 roll {
  214.       .currentstackprotect {
  215.         % The count is the original stack depth + 2.
  216.         count exch 4 sub sub { exch pop } repeat
  217.         aload pop end
  218.       } {
  219.         % Don't restore the stacks.
  220.         pop pop
  221.       } ifelse stop
  222.     } {
  223.       pop pop end
  224.     } ifelse
  225. } bind def
  226. /resourceforall {    % <template> <proc> <scratch> <category> resourceforall1 -
  227.     //resourceforall1 exec        % see above
  228. } bind odef
  229. /resourcestatus {    % <key> <category> resourcestatus <status> <size> true
  230.             % <key> <category> resourcestatus false
  231.     2 copy .findcategory /ResourceStatus .resourceexec
  232.      { 4 2 roll pop pop true } { pop pop false } ifelse
  233. } bind odef
  234. /undefineresource {    % <key> <category> undefineresource -
  235.     2 copy .findcategory /UndefineResource .resourceexec pop pop
  236. } bind odef
  237.  
  238. % Define the system parameters used for the Generic implementation of
  239. % ResourceFileName.
  240. systemdict begin
  241. currentdict /pssystemparams known not {
  242.   /pssystemparams 10 dict readonly def
  243. } if
  244. pssystemparams begin
  245.   /FontResourceDir (/Resource/Font/) readonly .forcedef    % pssys'params is r-o
  246.   /GenericResourceDir (/Resource/) readonly .forcedef    % pssys'params is r-o
  247.   /GenericResourcePathSep (/) readonly .forcedef    % pssys'params is r-o
  248. end
  249. end
  250.  
  251. % Define the generic algorithm for computing resource file names.
  252. /.rfnstring 100 string def
  253. /.genericrfn        % <key> <scratch> <prefix> .genericrfn <filename>
  254.  { 3 -1 roll //.rfnstring cvs concatstrings exch copy
  255.  } bind def
  256.  
  257. % Define a procedure for making a packed array in local VM.
  258. /.localpackedarray {    % <obj1> ... <objn> <n> .localpackedarray <packedarray>
  259.   .currentglobal false .setglobal 1 index 2 add 1 roll
  260.   packedarray exch .setglobal
  261. } bind def
  262.  
  263. % Define the Generic category.
  264.  
  265. /Generic mark
  266.  
  267.         % Standard entries
  268.  
  269. % We're still running in Level 1 mode, so dictionaries won't expand.
  270. % Leave room for the /Category entry.
  271. /Category null
  272.  
  273. % Implement the body of Generic resourceforall for local, global, and
  274. % external cases.  'args' is [template proc scratch resdict].
  275. /.enumerateresource {    % <key> [- <proc> <scratch>] .enumerateresource -
  276.   1 index type dup /stringtype eq exch /nametype eq or {
  277.     exch 1 index 2 get cvs exch
  278.   } if
  279.     % Use .setstackprotect to prevent the stacks from being restored if
  280.     % an error occurs during execution of proc.
  281.   1 get false .setstackprotect exec true .setstackprotect
  282. } bind def
  283. /.localresourceforall {        % <key> <value> <args> .localr'forall -
  284.   exch pop
  285.   2 copy 0 get .stringmatch { .enumerateresource } { pop pop } ifelse
  286. } bind def
  287. /.globalresourceforall {    % <key> <value> <args> .globalr'forall -
  288.   exch pop
  289.   2 copy 0 get .stringmatch {
  290.     dup 3 get begin .LocalInstances end 2 index known not {
  291.       .enumerateresource
  292.     } if
  293.   } {
  294.     pop pop
  295.   } ifelse
  296. } bind def
  297. /.externalresourceforall {    % <filename> <len> <args> .externalr'forall -
  298.   3 1 roll 1 index length 1 index sub getinterval exch
  299.   dup 3 get begin .Instances .LocalInstances end
  300.         % Stack: key args insts localinsts
  301.   3 index known {
  302.     pop pop pop
  303.   } {
  304.     2 index known { pop pop } { .enumerateresource } ifelse
  305.   } ifelse
  306. } bind def
  307.  
  308. /DefineResource {
  309.     .CheckResource
  310.        { dup [ exch 0 -1 ]
  311.             % Stack: key value instance
  312.          currentglobal
  313.           { false setglobal 2 index UndefineResource    % remove local def if any
  314.         true setglobal
  315.         .Instances dup //.emptydict eq {
  316.           pop 3 dict
  317.             % As noted above, Category dictionaries are read-only,
  318.             % so we have to use .forcedef here.
  319.           /.Instances 1 index .forcedef    % Category dict is read-only
  320.         } if
  321.           }
  322.           { .LocalInstances dup //.emptydict eq
  323.              { pop 3 dict localinstancedict Category 2 index put
  324.          }
  325.         if
  326.           }
  327.          ifelse
  328.             % Stack: key value instance instancedict
  329.          3 index 2 index .growput
  330.             % Now make the resource value read-only.
  331.          0 2 copy get { readonly } .internalstopped pop
  332.          dup 4 1 roll put exch pop exch pop
  333.        }
  334.        { /defineresource load /typecheck signalerror
  335.        }
  336.     ifelse
  337. } bind executeonly        % executeonly to prevent access to .forcedef
  338. /UndefineResource
  339.     {  { dup 2 index .knownget
  340.           { dup 1 get 1 ge
  341.          { dup 0 null put 1 2 put pop pop }
  342.          { pop exch .undef }
  343.         ifelse
  344.           }
  345.           { pop pop
  346.           }
  347.          ifelse
  348.        }
  349.       currentglobal
  350.        { 2 copy .Instances exch exec
  351.        }
  352.       if .LocalInstances exch exec
  353.     } bind
  354. % Because of some badly designed code in Adobe's CID font downloader that
  355. % makes findresource and resourcestatus deliberately inconsistent with each
  356. % other, the default FindResource must not call ResourceStatus if there is
  357. % an instance of the desired name already defined in VM.
  358. /FindResource {
  359.     dup .getvminstance {
  360.       exch pop 0 get
  361.     } {
  362.       dup ResourceStatus {
  363.         pop 1 gt {
  364.           .DoLoadResource .getvminstance not {
  365.         /findresource load /undefinedresource signalerror
  366.           } if 0 get
  367.         } {
  368.           .GetInstance pop 0 get
  369.         } ifelse
  370.       } {
  371.        /findresource load /undefinedresource signalerror
  372.       } ifelse
  373.     } ifelse
  374. } bind
  375. % Because of some badly designed code in Adobe's CID font downloader, the
  376. % definition of ResourceStatus for Generic and Font must be the same (!).
  377. % We patch around this by using an intermediate .ResourceFileStatus procedure.
  378. /ResourceStatus {
  379.     dup .GetInstance {
  380.       exch pop dup 1 get exch 2 get true
  381.     } {
  382.       .ResourceFileStatus
  383.     } ifelse
  384. } bind
  385. /.ResourceFileStatus {
  386.     .ResourceFile { closefile 2 -1 true } { pop false } ifelse
  387. } bind
  388. /ResourceForAll {
  389.         % **************** Doesn't present instance groups in
  390.         % **************** the correct order yet.
  391.         % Construct a new procedure to hold the arguments.
  392.         % All objects constructed here must be in local VM to avoid
  393.         % a possible invalidaccess.
  394.     currentdict 4 .localpackedarray    % [template proc scratch resdict]
  395.         % We must pop the resource dictionary off the dict stack
  396.         % when doing the actual iteration, and restore it afterwards.
  397.     .currentglobal not {
  398.       .LocalInstances length 0 ne {
  399.         % We must do local instances, and do them first.
  400.         //.localresourceforall {exec} 0 get 3 .localpackedarray cvx
  401.         .LocalInstances exch {forall} 0 get 1 index 0 get
  402.         currentdict end 3 .execn begin
  403.       } if
  404.     } if
  405.         % Do global instances next.
  406.     //.globalresourceforall {exec} 0 get 3 .localpackedarray cvx
  407.     .Instances exch cvx {forall} 0 get 1 index 0 get
  408.     currentdict end 3 .execn begin
  409.     currentdict /ResourceFileName known {
  410.         % Finally, do instances stored on files.
  411.       dup 0 get 100 string ResourceFileName
  412.       dup length 2 index 0 get length sub 3 -1 roll
  413.       //.externalresourceforall {exec} 0 get 4 .localpackedarray cvx
  414.       100 string {filenameforall} 0 get
  415.       currentdict end 2 .execn begin null    % for pop
  416.     } if pop
  417. } bind
  418. /ResourceFileName
  419.     { /GenericResourceDir getsystemparam 
  420.       Category .namestring concatstrings
  421.       /GenericResourcePathSep getsystemparam concatstrings
  422.       .genericrfn
  423.     } bind
  424.  
  425.         % Additional entries
  426.  
  427. % Unfortunately, we can't create the real .Instances dictionary now,
  428. % because if someone copies the Generic category (which pp. 95-96 of the
  429. % 2nd Edition Red Book says is legitimate), they'll wind up sharing
  430. % the .Instances.  Instead, we have to create .Instances on demand,
  431. % just like the entry in localinstancedict.
  432. % We also have to prevent anyone from creating instances of Generic itself.
  433. /.Instances //.emptydict
  434.  
  435. /.LocalInstances
  436.     { localinstancedict Category .knownget not { //.emptydict } if
  437.     } bind
  438. /.GetInstance
  439.     { currentglobal
  440.        { .Instances exch .knownget }
  441.        { .LocalInstances 1 index .knownget
  442.           { exch pop true }
  443.           { .Instances exch .knownget }
  444.          ifelse
  445.        }
  446.       ifelse
  447.     } bind
  448. /.CheckResource
  449.     { true
  450.     } bind
  451. /.vmused {
  452.         % - .vmused <usedvalue>
  453.         % usedvalue = vmstatus in global + vmstatus in local.
  454.   0 2 {
  455.     .currentglobal not .setglobal
  456.     vmstatus pop exch pop add
  457.   } repeat
  458. } bind def
  459. /.DoLoadResource {
  460.         % .LoadResource may push entries on the operand stack.
  461.         % It is an undocumented feature of Adobe implementations,
  462.         % which we must match for the sake of some badly written
  463.         % font downloading code, that such entries are popped
  464.         % automatically.
  465.     count 1 index cvlit .vmused
  466.         % Stack: key count litkey memused
  467.     {.LoadResource} 4 1 roll 4 .execn
  468.         % Stack: ... count key memused
  469.     .vmused exch sub
  470.     1 index .getvminstance not {
  471.       pop dup /undefinedresource signalerror    % didn't load
  472.     } if
  473.     dup 1 1 put
  474.     2 3 -1 roll put
  475.         % Stack: ... count key
  476.     exch count 1 sub exch sub {exch pop} repeat
  477. } bind
  478. /.LoadResource
  479.     { dup .ResourceFile
  480.        { exch pop currentglobal
  481.           { .runresource }
  482.           { true setglobal { .runresource } stopped false setglobal { stop } if }
  483.          ifelse
  484.        }
  485.        { dup /undefinedresource signalerror
  486.        }
  487.      ifelse
  488.     } bind
  489. /.ResourceFile
  490.     { currentdict /ResourceFileName known
  491.        { mark 1 index 100 string { ResourceFileName }
  492.          .internalstopped
  493.           { cleartomark false }
  494.           { exch pop findlibfile
  495.          { exch pop exch pop true }
  496.          { pop false }
  497.         ifelse
  498.           }
  499.          ifelse
  500.        }
  501.        { false }
  502.       ifelse
  503.     } bind
  504.  
  505. .dicttomark
  506. /Category defineresource pop
  507.  
  508. % Fill in the rest of the Category category.
  509. /Category /Category findresource dup
  510. /Generic /Category findresource begin {
  511.   /FindResource /ResourceForAll /ResourceStatus /.ResourceFileStatus
  512.   /UndefineResource /ResourceFileName
  513.   /.ResourceFile /.LoadResource /.DoLoadResource
  514. } { dup load put dup } forall
  515. pop readonly pop end
  516.  
  517. (END GENERIC) VMDEBUG
  518.  
  519. % Define the fixed categories.
  520.  
  521. mark
  522.     % Non-Type categories with existing entries.
  523.  /ColorSpaceFamily
  524.    { }    % These must be deferred, because optional features may add some.
  525.  /Emulator
  526.    mark EMULATORS { cvn } forall .packtomark
  527.  /Filter
  528.    { }    % These must be deferred, because optional features may add some.
  529.  /IODevice
  530.     % Loop until the .getiodevice gets a rangecheck.
  531.    errordict /rangecheck 2 copy get
  532.    errordict /rangecheck { pop stop } put    % pop the command
  533.    mark 0 { {
  534.     dup .getiodevice dup null eq { pop } { exch } ifelse 1 add
  535.    } loop} .internalstopped
  536.    pop pop pop .packtomark
  537.    4 1 roll put
  538.    .clearerror
  539.     % Type categories listed in the Red Book.
  540.  /ColorRenderingType
  541.    { }    % These must be deferred, because optional features may add some.
  542.  /FMapType
  543.    { }    % These must be deferred, because optional features may add some.
  544.  /FontType
  545.    { }    % These must be deferred, because optional features may add some.
  546.  /FormType
  547.    { }    % These must be deferred, because optional features may add some.
  548.  /HalftoneType
  549.    { }    % These must be deferred, because optional features may add some.
  550.  /ImageType
  551.    { }    % Deferred, optional features may add some.
  552.  /PatternType
  553.    { }  % Deferred, optional features may add some.
  554.     % Type categories added since the Red Book.
  555.  /setsmoothness where {
  556.    pop /ShadingType { }    % Deferred, optional features may add some.
  557.  } if
  558. counttomark 2 idiv
  559.  { mark
  560.  
  561.         % Standard entries
  562.  
  563.         % We'd like to prohibit defineresource,
  564.         % but because optional features may add entries, we can't.
  565.         % We can at least require that the key and value match.
  566.    /DefineResource
  567.     { currentglobal not
  568.        { /defineresource load /invalidaccess signalerror }
  569.        { 2 copy ne
  570.           { /defineresource load /rangecheck signalerror }
  571.           { dup .Instances 4 -2 roll .growput }
  572.          ifelse
  573.        }
  574.       ifelse
  575.     } bind
  576.    /UndefineResource
  577.     { /undefineresource load /invalidaccess signalerror } bind
  578.    /FindResource
  579.     { .Instances 1 index .knownget
  580.        { exch pop }
  581.        { /findresource load /undefinedresource signalerror }
  582.       ifelse
  583.     } bind
  584.    /ResourceStatus
  585.     { .Instances exch known { 0 0 true } { false } ifelse } bind
  586.    /ResourceForAll
  587.     /Generic /Category findresource /ResourceForAll get
  588.  
  589.         % Additional entries
  590.  
  591.    counttomark 2 add -1 roll
  592.    dup length dict dup begin exch { dup def } forall end
  593.         % We'd like to make the .Instances readonly here,
  594.         % but because optional features may add entries, we can't.
  595.    /.Instances exch
  596.    /.LocalInstances    % used by ResourceForAll
  597.     0 dict def
  598.  
  599.    .dicttomark /Category defineresource pop
  600.  } repeat pop
  601.  
  602. (END FIXED) VMDEBUG
  603.  
  604. % Define the other built-in categories.
  605.  
  606. /.definecategory    % <name> -mark- <key1> ... <valuen> .definecategory -
  607.  { counttomark 2 idiv 2 add        % .Instances, Category
  608.    /Generic /Category findresource dup maxlength 3 -1 roll add
  609.    dict .copydict begin
  610.    counttomark 2 idiv { def } repeat pop    % pop the mark
  611.    currentdict end /Category defineresource pop
  612.  } bind def
  613.  
  614. /ColorRendering mark /InstanceType /dicttype .definecategory
  615. % ColorSpace is defined below
  616. % Encoding is defined below
  617. % Font is defined below
  618. /Form mark /InstanceType /dicttype .definecategory
  619. /Halftone mark /InstanceType /dicttype .definecategory
  620. /Pattern mark /InstanceType /dicttype .definecategory
  621. /ProcSet mark /InstanceType /dicttype .definecategory
  622. % Added since the Red Book:
  623. /ControlLanguage mark /InstanceType /dicttype .definecategory
  624. /HWOptions mark /InstanceType /dicttype .definecategory
  625. /Localization mark /InstanceType /dicttype .definecategory
  626. /OutputDevice mark /InstanceType /dicttype .definecategory
  627. /PDL mark /InstanceType /dicttype .definecategory
  628. % CIDFont, CIDMap, and CMap are defined in gs_cidfn.ps
  629. % FontSet is defined in gs_cff.ps
  630. % IdiomSet is defined in gs_ll3.ps
  631. % InkParams and TrapParams are defined in gs_trap.ps
  632.  
  633. (END MISC) VMDEBUG
  634.  
  635. % Define the ColorSpace category.
  636.  
  637. /.defaultcsnames mark
  638.   /DefaultGray 0
  639.   /DefaultRGB 1
  640.   /DefaultCMYK 2
  641. .dicttomark readonly def
  642.  
  643. % The "hooks" are no-ops here, redefined in LL3.
  644. /.definedefaultcs {    % <index> <value> .definedefaultcs -
  645.   pop pop
  646. } bind def
  647. /.undefinedefaultcs {    % <index> .undefinedefaultcs -
  648.   pop
  649. } bind def
  650.  
  651. /ColorSpace mark
  652.  
  653. /InstanceType /arraytype
  654.  
  655. % We keep track of whether there are any local definitions for any of
  656. % the Default keys.  This information must get saved and restored in
  657. % parallel with the local instance dictionary, so it must be stored in
  658. % local VM.
  659. userdict /.localcsdefaults false put
  660.  
  661. /DefineResource {
  662.   2 copy /Generic /Category findresource /DefineResource get exec
  663.   exch pop
  664.   exch //.defaultcsnames exch .knownget {
  665.     1 index .definedefaultcs
  666.     currentglobal not { .userdict /.localcsdefaults true put } if
  667.   } if
  668. } bind
  669.  
  670. /UndefineResource {
  671.   dup /Generic /Category findresource /UndefineResource get exec
  672.   //.defaultcsnames 1 index .knownget {
  673.     % Stack: resname index
  674.     currentglobal {
  675.       .undefinedefaultcs pop
  676.     } {
  677.     % We removed the local definition, but there might be a global one.
  678.       exch .GetInstance {
  679.     0 get .definedefaultcs
  680.       } {
  681.     .undefinedefaultcs
  682.       } ifelse
  683.     % Recompute .localcsdefaults by scanning.  This is rarely needed.
  684.       .userdict /.localcsdefaults false //.defaultcsnames {
  685.     pop .LocalInstances exch known { pop true exit } if
  686.       } forall put
  687.     } ifelse
  688.   } {
  689.     pop
  690.   } ifelse
  691. } bind
  692.  
  693. .definecategory            % ColorSpace
  694.  
  695. % Define the Encoding category.
  696.  
  697. /Encoding mark
  698.  
  699. /InstanceType /arraytype
  700.  
  701. % Handle already-registered encodings, including lazily loaded encodings
  702. % that aren't loaded yet.
  703.  
  704. /.Instances mark
  705.   EncodingDirectory
  706.    { dup length 256 eq { [ exch readonly 0 -1 ] } { pop [null 2 -1] } ifelse
  707.    } forall
  708. .dicttomark
  709.  
  710. /.ResourceFileDict mark
  711.   EncodingDirectory
  712.    { dup length 256 eq { pop pop } { 0 get } ifelse
  713.    } forall
  714. .dicttomark
  715.  
  716. /ResourceFileName
  717.  { .ResourceFileDict 2 index .knownget
  718.     { exch copy exch pop }
  719.     { /Generic /Category findresource /ResourceFileName get exec }
  720.    ifelse
  721.  } bind
  722.  
  723. .definecategory            % Encoding
  724.  
  725. % Make placeholders in level2dict for the redefined Encoding operators,
  726. % so that they will be swapped properly when we switch language levels.
  727.  
  728. /.findencoding /.findencoding load def
  729. /findencoding /findencoding load def
  730. /.defineencoding /.defineencoding load def
  731.  
  732. (END ENCODING) VMDEBUG
  733.  
  734. % Define the Font category.
  735.  
  736. /.fontstatus {        % <fontname> .fontstatus <fontname> <found>
  737.   {        % Create a loop context just so we can exit it early.
  738.         % Check Fontmap.
  739.     Fontmap 1 index .knownget {
  740.       {
  741.     dup type /nametype eq {
  742.       .fontstatus { pop null exit } if
  743.     } {
  744.       dup type /stringtype eq {
  745.         findlibfile { closefile pop null exit } if pop
  746.       } {
  747.         % Procedure, assume success.
  748.         pop null exit
  749.       } ifelse
  750.     } ifelse
  751.       } forall dup null eq { pop true exit } if
  752.     } if
  753.         % Convert names to strings; give up on other types.
  754.     dup type /nametype eq { .namestring } if
  755.     dup type /stringtype ne { false exit } if
  756.         % Check the resource directory.
  757.     dup .fonttempstring /FontResourceDir getsystemparam .genericrfn
  758.     status {
  759.       pop pop pop pop true exit
  760.     } if
  761.         % Check for a file on the search path with the same name
  762.         % as the font.
  763.     findlibfile { closefile true exit } if
  764.         % Scan a FONTPATH directory and try again.
  765.     .scannextfontdir not { false exit } if
  766.   } loop
  767. } bind def
  768.  
  769. /Font mark
  770.  
  771. /InstanceType /dicttype
  772.  
  773. /DefineResource
  774.     { 2 copy //definefont exch pop
  775.       /Generic /Category findresource /DefineResource get exec
  776.     } bind
  777. /UndefineResource
  778.     { dup //undefinefont
  779.       /Generic /Category findresource /UndefineResource get exec
  780.     } bind
  781. /FindResource {
  782.     dup .getvminstance {
  783.       exch pop 0 get
  784.     } {
  785.       dup ResourceStatus {
  786.         pop 1 gt { .loadfontresource } { .GetInstance pop 0 get } ifelse
  787.       } {
  788.         .loadfontresource
  789.       } ifelse
  790.     } ifelse
  791. } bind
  792. /ResourceForAll {
  793.     { .scannextfontdir not { exit } if } loop
  794.     /Generic /Category findresource /ResourceForAll get exec
  795. } bind
  796. /.ResourceFileStatus {
  797.     .fontstatus { pop 2 -1 true } { pop false } ifelse
  798. } bind
  799.  
  800. /.loadfontresource {
  801.     dup vmstatus pop exch pop exch
  802.         % Hack: rebind .currentresourcefile so that all calls of
  803.         % definefont will know these are built-in fonts.
  804.     currentfile {pop //findfont exec} .execasresource  % (findfont is a procedure)
  805.     exch vmstatus pop exch pop exch sub
  806.         % stack: name font vmused
  807.         % findfont has the prerogative of not calling definefont
  808.         % in certain obscure cases of font substitution.
  809.     2 index .getvminstance {
  810.       dup 1 1 put
  811.       2 3 -1 roll put
  812.     } {
  813.       pop
  814.     } ifelse exch pop
  815. } bind
  816.  
  817. /.Instances FontDirectory length 2 mul dict
  818.  
  819. .definecategory            % Font
  820.  
  821. % Redefine font "operators".
  822. /.definefontmap
  823.  { /Font /Category findresource /.Instances get
  824.    dup 3 index known
  825.     { pop
  826.     }
  827.     { 2 index
  828.         % Make sure we create the array in global VM.
  829.       .currentglobal true .setglobal
  830.       [null 2 -1] exch .setglobal
  831.       .growput
  832.     }
  833.    ifelse
  834.    //.definefontmap exec
  835.  } bind def
  836.  
  837. % Make sure the old definitions are still in systemdict so that
  838. % they will get bound properly.
  839. systemdict begin
  840.   /.origdefinefont /definefont load def
  841.   /.origundefinefont /undefinefont load def
  842.   /.origfindfont /findfont load def
  843. end
  844. /definefont {
  845.   /Font defineresource
  846. } bind odef
  847. /undefinefont {
  848.   /Font undefineresource
  849. } bind odef
  850. % The Red Book requires that findfont be a procedure, not an operator,
  851. % but it still needs to restore the stacks reliably if it fails.
  852. /.findfontop {
  853.   /Font findresource
  854. } bind odef
  855. /findfont {
  856.   .findfontop
  857. } bind def    % Must be a procedure, not an operator
  858.  
  859. % Remove initialization utilities.
  860. currentdict /.definecategory .undef
  861. currentdict /.emptydict .undef
  862.  
  863. end                % level2dict
  864.  
  865. % Convert deferred resources after we finally switch to Level 2.
  866.  
  867. /.fixresources {
  868.     % Encoding resources
  869.   EncodingDirectory
  870.    { dup length 256 eq
  871.       { /Encoding defineresource pop }
  872.       { pop pop }
  873.      ifelse
  874.    } forall
  875.   /.findencoding { /Encoding findresource } bind def
  876.   /findencoding /.findencoding load def        % must be a procedure
  877.   /.defineencoding { /Encoding defineresource pop } bind def
  878.     % ColorRendering resources and ProcSet
  879.   systemdict /ColorRendering .knownget {
  880.     /ColorRendering exch /ProcSet defineresource pop
  881.     systemdict /ColorRendering undef
  882.     /Default currentcolorrendering /ColorRendering defineresource pop
  883.   } if
  884.     % ColorSpace resources
  885.   systemdict /CIEsRGB .knownget {
  886.     /sRGB exch /ColorSpace defineresource pop
  887.     systemdict /CIEsRGB undef
  888.   } if
  889.     % ColorSpaceFamily resources
  890.   colorspacedict { pop dup /ColorSpaceFamily defineresource pop } forall
  891.     % Filter resources
  892.   filterdict { pop dup /Filter defineresource pop } forall
  893.     % FontType and FMapType resources
  894.   buildfontdict { pop dup /FontType defineresource pop } forall
  895.   mark
  896.     buildfontdict 0 known { 2 3 4 5 6 7 8 } if
  897.     buildfontdict 9 known { 9 } if
  898.   counttomark { dup /FMapType defineresource pop } repeat pop
  899.     % FormType resources
  900.   .formtypes { pop dup /FormType defineresource pop } forall
  901.     % HalftoneType resources
  902.   .halftonetypes { pop dup /HalftoneType defineresource pop } forall
  903.     % ColorRenderingType resources
  904.   .colorrenderingtypes {pop dup /ColorRenderingType defineresource pop} forall
  905.     % ImageType resources
  906.   .imagetypes { pop dup /ImageType defineresource pop } forall
  907.     % PatternType resources
  908.   .patterntypes { pop dup /PatternType defineresource pop } forall
  909.     % Make the fixed resource categories immutable.
  910.   /.shadingtypes where {
  911.     pop .shadingtypes { pop dup /ShadingType defineresource pop } forall
  912.   } if
  913.   [ /ColorSpaceFamily /Emulator /Filter /IODevice /ColorRenderingType
  914.     /FMapType /FontType /FormType /HalftoneType /ImageType /PatternType
  915.     /.shadingtypes where { pop /ShadingType } if
  916.   ] {
  917.     /Category findresource
  918.     dup /.Instances get readonly pop
  919.     .LocalInstances readonly pop
  920.     readonly pop
  921.   } forall
  922.     % clean up
  923.   systemdict /.fixresources undef
  924. } bind def
  925.